package com.bitoon.basketdudes.web.interceptors;

import com.bitoon.basketdudes.web.BaseAction;
import com.bitoon.basketdudes.web.jpa.Activacion;
import com.bitoon.basketdudes.web.jpa.PersistenceManager;
import com.bitoon.basketdudes.web.jpa.Usuario;
 
import com.opensymphony.xwork2.*;
import com.opensymphony.xwork2.interceptor.I18nInterceptor;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.util.ValueStack;
import java.io.*;
import java.util.*;
import javax.persistence.*;
import javax.servlet.http.Cookie;
import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;

public class Login implements Interceptor {

    private Logger log = Logger.getLogger(Login.class);

    private String bdrc;

    /*
    protected HttpServletRequest servletRequest;
    @Override
    public void setServletRequest(HttpServletRequest servletRequest) {
        //log.debug("[interceptorLogin] setServletRequest en interceptor login");
        this.servletRequest = servletRequest;
    }
     *
     */

    public void destroy() {
    }

    public void init() {
    }

    public String intercept(ActionInvocation actionInvocation) throws Exception {
        //ActionContext actionContext = actionInvocation.getInvocationContext();
        //Map session = actionContext.getSession();

        //log.debug("Interceptor Login !!!");

        Map session = ActionContext.getContext().getSession();

        String cookieComprobada = (String)session.get("bd_cC");
        String cookiePaypal = (String)session.get("bd_ppp");

        EntityManager em = null;

        try {

            // <Landing>

            session.put("bd_mostrarlanding", true);

            Cookie[] cookies = ServletActionContext.getRequest().getCookies();

            // Comprobar si hay cookie bdrc

            //log.debug("Comprobando cookies para landing");

            if (cookies != null) {
                for(Cookie c : cookies) {
                    //log.debug("cookie: " + c.getName());
                    if (c.getName().equals("bdlndng")) {
                        // Existe la cookie, poner la sesion a false
                        log.debug("pongo a false mostrarlanding ...");
                        session.put("bd_mostrarlanding", false);
                    }
                }
            }

            //log.debug("Cookies para landing comprobadas: " + session.get("bd_mostrarlanding"));

            // </Landing>

            EntityManagerFactory emfBasket = PersistenceManager.getInstance().getEntityManagerFactory(BaseAction.catalogos[0]);
            em = emfBasket.createEntityManager(); // checked

            //log.debug("[interceptorLogin] cookieComprobada: " + cookieComprobada);

            if (cookieComprobada==null) {
                cookieComprobada="";
            }
            if (cookiePaypal==null) {
                cookiePaypal="";
            }

            if (cookiePaypal.equals("ptcb")) { // pendiente de callback
                // Recargar el usuario logado de la base de datos
                //log.debug("[interceptorLogin] Recargando usuario despues de paypal");
                Usuario u = (Usuario)session.get("bd_userLogado");

                if (u!=null) {
                    // Consultar de nuevo a la base de datos
                    Usuario nu = (Usuario)em.find(Usuario.class, u.getId());
                    if (nu.getCreditos()!=u.getCreditos()) {
                        // Actualizacion de creditos
                        session.put("bd_userLogado", nu);
                        session.put("bd_ppp","ncb"); // no callback
                    }
                }
            }

            if (!cookieComprobada.equalsIgnoreCase("c")) {

                session.put("bd_cC", "c");
                //log.debug("[interceptorLogin] fijada: " + session.get("bd_cC"));

                //Cookie[] cookies = ServletActionContext.getRequest().getCookies();

                // Comprobar si hay cookie bdrc
                if (cookies != null) {
                    try  {
                        for(Cookie c : cookies) {
                            if (c.getName().equals("bdrc")) {
                                String clave = c.getValue();
                                String[] pares = clave.split("-");

                                try {
                                    Query q = em.createNamedQuery("Usuario.findByNick");
                                    q.setParameter("nick", pares[0]);
                                    Usuario u = (Usuario)q.getSingleResult();

                                    // Encontrado el usuario, comprobar que la clave coincide

                                    q = em.createNamedQuery("Activacion.findByHashUsuarioId");
                                    q.setParameter("idUsuario", u.getId());
                                    q.setParameter("hash", pares[1]);
                                    Activacion a = (Activacion)q.getSingleResult();

                                    //log.debug("a: " + a);

                                    // Se ha encontrado, el par de la cookie es válido, habilitar login automático

                                    session.put("bd_userId", Integer.toString(u.getId()));
                                    session.put("bd_userLogado", u);

                                } catch (NoResultException e) {
                                    // No existen datos para la activacion
                                    //log.debug("[interceptorLogin] No se ha podido comprobar la cookie bdrc");
                                } catch (Exception e) {
                                    log.error("[interceptorLogin] ", e);
                                }
                            }
                        }
                    } catch (Exception e) {
                        log.error("[interceptorLogin] error en interceptor de login: " , e);
                    }
                }
            }

            // Eliminamos cualquier mensaje de alerta del sistema de mensajes

            ValueStack valueStack = ActionContext.getContext().getValueStack();

            Boolean logado = estaLogado(session);
            valueStack.set("stackLogado", logado);

            //log.debug(">>>>>> logado en Login: " + logado);

            if (logado) {
                //log.debug("[en 1]");
                valueStack.set("stackCabecera", "cabecera_con_id.jsp");
                valueStack.set("stackUserId", dameIdUsuarioLogado(session));
                valueStack.set("stackUserLogado", dameUsuarioLogado(session));
            } else {
                //log.debug("[en 2]");
                valueStack.set("stackCabecera", "cabecera_sin_id.jsp");
            }

            //log.debug("[interceptorLogin] i18n - Leyendo bd_lang de sesion: " + (String)session.get("bd_lang"));
            //log.debug("[interceptorLogin] leyendo del contexto .............. " + ActionContext.getContext().getLocale().getLanguage());
            
            if (session.containsKey("bd_lang")) {
                String slang = (String)session.get("bd_lang");
                //log.debug(">>>> INTERNATIONALIZATION: slang = " + slang);
                slang = "zh";
                //log.debug(">>>> pruebalunes: setLocale 1: " + slang);
                ActionContext.getContext().setLocale(new Locale(slang));
            } else {
                String lang = ActionContext.getContext().getLocale().getLanguage();
                lang = "zh";
                session.put("bd_lang", lang);
                //log.debug("[interceptorLogin] fijando bd_lang: " + ActionContext.getContext().getLocale().getLanguage());
                //log.debug("[interceptorLogin] fijando bd_lang: " + lang);
                session.put(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE, lang);
                ActionContext.getContext().setLocale(new Locale(lang));
                //log.debug(">>>> pruebalunes: setLocale 2: " + lang);
            }
        } catch (Exception e) {
            log.error("[interceptorLogin] Error", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return actionInvocation.invoke();

    }

    private boolean estaLogado(Map session) {

        boolean retorno = false;
        //log.debug("[interceptorLogin] [1]");
        if (session.containsKey("bd_userId")) {
            if ( (Integer.parseInt((String)session.get("bd_userId"))) > 0) {
                retorno = true;
                //log.debug("interceptor login [2]");
            }
        }

        return retorno;
    }

    private String dameIdUsuarioLogado(Map session) {
        String retorno = "";

        if (session.containsKey("bd_userId")) {
            retorno = (String)session.get("bd_userId");
        } else {
            retorno = "0";
        }

        return retorno;
    }

    private Usuario dameUsuarioLogado(Map session) {
        Usuario retorno = null;

        if (session.containsKey("bd_userLogado")) {
            retorno = (Usuario)session.get("bd_userLogado");

            FileOutputStream fos = null;
            ObjectOutputStream out = null;
            try {

                File file = new File("/home/webdev/outsize.txt");
                fos = new FileOutputStream(file);
                out = new ObjectOutputStream(fos);
                out.writeObject(retorno);
                out.close();

            } catch (Exception e) {
                log.error("[interceptorLogin] Error: " + e);
            }

        } 

        return retorno;
    }

    public String getBdrc() {
        return bdrc;
    }

    public void setBdrc(String bdrc) {
        this.bdrc = bdrc;
    }

}
